Skip to main content

期权隐含波动率曲面计算方法文档

朱陈毓 2025.05.28

1 ETF期权隐含波动率计算步骤

1.1 计算 SyntheticYield:

对于每个 SeqStamp,重复步骤 1-5 :

  1. 使用 10sData 买1价与卖1价的平均价格,即中间价计算看涨期权 CallPrice,看跌期权 PutPrice ,ETF 价格 ETFPrice
CallPrice=Bid1 Price(Call)+Ask1 Price(Call)2PutPrice=Bid1 Price(Put)+Ask1 Price(Put)2ETFPrice=Bid1 Price(ETF)+Ask1 Price(ETF)2\begin{equation} \begin{aligned} \text{CallPrice} &= \frac{\text{Bid1 Price(Call)} + \text{Ask1 Price(Call)}}{2} \\ \text{PutPrice} &= \frac{\text{Bid1 Price(Put)} + \text{Ask1 Price(Put)}}{2} \\ \text{ETFPrice} &= \frac{\text{Bid1 Price(ETF)} + \text{Ask1 Price(ETF)}}{2} \end{aligned} \end{equation}

对于CallPricePutPrice因为报价不全出现异常,如价格为0或者null,则不进入下一步的配对环节。 2. 对同一个到期日的看涨,看跌期权按照行权价 K 配对,得到 MM 个配对

(CallPriceK1,PutPriceK1)(CallPriceK2,PutPriceK2)...(CallPriceKM,PutPriceKM)(\text{CallPrice}_{K_1}, \text{PutPrice}_{K_1})\\ (\text{CallPrice}_{K_2}, \text{PutPrice}_{K_2})\\ ... \\ (\text{CallPrice}_{K_M}, \text{PutPrice}_{K_M})
  1. 对每一个配对,计算看涨期权和看跌期权价格之差 C_minus_P
C_minus_Pi=CallPriceKiPutPriceKi\text{C\_minus\_P}_i = \text{CallPrice}_{K_i} - \text{PutPrice}_{K_i}
  1. 依次选取出 C_minus_P 绝对值最小对应的 4 个行权价 {Kmin1,Kmin2,Kmin3,Kmin4}\{K_{min1}, K_{min2}, K_{min3}, K_{min4}\} ,分别计算出对应的q_min1, q_min2, q_min3, q_min4,其中 q 的计算公式为:

    q=log(ETFPriceC_minus_P+Kexp(rT))Tq = \frac{ \log\left( \frac{\text{ETFPrice}}{\text{C\_minus\_P} + K\cdot \exp(-rT) }\right)}{T}
  2. 对4个 q_min1, q_min2, q_min3, q_min4取平均值得到 SyntheticYield

SyntheticYield=qmin1+qmin2+qmin3+qmin44\text{SyntheticYield} = \frac{q_{min1}+ q_{min2}+ q_{min3}+ q_{min4}}{4}

完成上述步骤可以得到不同ETF期权到期日对应的 SyntheticYield 时间序列,将它保存为二维DataFrame,其中列为期权的到期日

# SyntheticYield DataFrame例子
20250326 | 20250407 | 20250926 |
0.01 | 0.02 | 0.03 |
0.03 | 0.05 | 0.02 |
0.02 | 0.06 | 0.01 |
0.04 | 0.03 | 0.04 |

得到上述序列后,对每一列进行EWM处理,具体方法如下: 给出 half_life 参数为 hh ,根据公式

α=1exp(log2/h)\alpha = 1-\exp(-\log2/h)

得到alpha,在给定原始yield序列为 x0,,xtx_0,\cdots,x_t ,可以得到处理后的序列 yty_t 为:

yt=αxt+(1α)xt1y_t=\alpha x_t + (1-\alpha)x_{t-1}

仍然得到上述二维表格。当遇到异常情况, xtx_t 为空值时, yty_t 延续 yt1y_{t-1} 的值,最多延续6次,之后 yty_t 设置为nan。如果没有到6次恢复,则延续有效 xtx_t 正常计算EWM。

保存

  1. SyntheticYield 保存为 .csv 文件,header 为 str 格式的期权到期日
  2. SyntheticYield 时间序列作为 yield_rt,保存在 VolSurf DataFrame 的 yield_rt 列中 ,注意每一行需要和 VolSurfexpiration ,以及 SeqStamp 一一对应

1.2 计算隐含波动率

对于每个 10s 切片:

  1. 使用 yield_rt 和 ETF 的中间价 ETFPrice,以及无风险利率 R,期权的到期剩余时间 Tenor,计算 ETF 的远期价格 ETFForwardPrice:
ETFForwardPrice=ETFPriceexp{(Ryield_rt)Tenor}\text{ETFForwardPrice} = \text{ETFPrice}\cdot\exp\{(R-\text{yield\_rt})\cdot \text{Tenor}\}
  1. 使用看涨/看跌期权的价格 OptionPrice,以及无风险利率 R,期权的到期剩余时间 Tenor,计算看涨期权和看跌期权的远期价格 OptionForwardPrice
OptionForwardPrice=OptionPriceexp(RTenor)\text{OptionForwardPrice} = \text{OptionPrice}\cdot\exp(R\cdot\text{Tenor})\\
  1. 使用 py_IV_Solve_LBR.implied_volatility_from_a_transformed_rational_guess_with_limited_iterations 函数,计算隐含波动率 implied_volatility
IVfun = py_IV_Solve_LBR.implied_volatility_from_a_transformed_rational_guess_with_limited_iterations
implied_volatility = IVfun(OptionForwardPrice, ETFForwardPrice, K, T, 0.0, type, 2)

对于看涨期权,type == 1,对于看跌期权,type == -1

将计算得到的隐含波动率保存在 VolSurf DataFrame 的 implied_vol_rt 列中。

2 实盘交易隐含波动率曲面参数计算步骤

实盘交易中,对每个10s切片的 DataFrame VolSurf,调用 VolatilitySurfaceModel.VolSurfFit_SVI_Realtime() 函数进行波动率曲面计算:

import VolatilitySurfaceModel as VS
VolSurfFit = VS.VolSurfFit_SVI_Realtime(VolSurf, SecStamp, MinPoints, nExp, Method, MinVolLevel, OptionPriceCutoff, InputTenor, MoneynessCutoff, yield_type)

该函数会返回 10s 切片时间点 SeqStampnExp 个到期日(从近到远)的隐含波动率曲面参数。对于中金所股指期权,该函数调用参数为:

MinPoints = 2
Method = 'CP'
MinVolLevel = 1e-4
OptionPriceCutoff = 0.29
InputTenor = 20.0
MoneynessCutoff = 0.075
yield_type = 'yield'

对于 ETF 期权,该函数调用参数为:

MinPoints=2,
Method='HP',
MinVolLevel=1e-4,
OptionPriceCutoff = 1.4e-4,
InputTenor = 40.0,
MoneynessCutoff = 0.05,
yield_type = 'yield_rt'